// 注意:
// 此模块只是一个标记，需要实现识别 secret_type 逻辑的代码才能做到给数据打码
// Mix-C 常规格式化输出模板基本都实现了这个功能，如果是自己定义的格式化模块，需要自行识别
#ifndef xpack_dumb_secret_type
#define xpack_dumb_secret_type
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::dumb_secret_type::inc
#include"meta/is_class.hpp"
#include"define/classify.hpp"
#include"define/base_type.hpp"
#include"macro/xexport.hpp"
#include"macro/xforward.hpp"
#include"macro/xmark+.hpp"
#include"macro/xstruct.hpp"
#include"meta/is_origin_string.hpp"
#pragma pop_macro("xuser")

namespace mixc::dumb_secret_type{
    template<class type_t, bool is_class_v> struct secret_type;
    template<class type_t>
    xstruct(
        xspec(secret_type, type_t, true),
        xpubb(type_t),
        xwhos(inc::classify_t::dumb_secret_type)
    )
        using origin_type = type_t;
        using type_t::type_t;
        using type_t::operator=;

        constexpr secret_type(type_t & value) : 
            type_t(value){}

        constexpr secret_type(type_t && value) : 
            type_t((type_t &&)value){}
    $

    template<class type_t>
    xstruct(
        xspec(secret_type, type_t, false),
        xprif(m_value, type_t),
        xwhos(inc::classify_t::dumb_secret_type)
    )
        using origin_type = type_t;

        template<class ... args_t>
        secret_type(args_t && ... list) : 
            m_value(xforward(list)...){
        }

        operator type_t & (){
            return m_value;
        }

        operator const type_t & () const {
            return m_value;
        }
    $

    template<inc::is_origin_string type_t>
    xstruct(
        xspec(secret_type, type_t, false),
        xprif(m_value, type_t),
        xwhos(inc::classify_t::dumb_secret_type)
    )
        using origin_type = type_t;
        xmark_is_string_wrapper();

        template<class ... args_t>
        secret_type(args_t && ... list) : 
            m_value(xforward(list)...){
        }

        operator type_t & (){
            return m_value;
        }

        operator const type_t & () const {
            return m_value;
        }
    $

    template<>
    xstruct(
        xspec(secret_type, void, false)
    ) $
}

namespace mixc::dumb_secret_type::origin{
    template<class type_t>
    using secret_type = mixc::dumb_secret_type::secret_type<type_t, inc::is_class<type_t>>;
}

#endif

xexport(mixc::dumb_secret_type::origin::secret_type)
